package com.smasher.widget.edit;

import android.text.InputFilter;
import android.text.Spanned;

import java.util.regex.Pattern;

/**
 * 限制小数和整数的位数的输入过滤器。
 * 构造器接受两个参数：小数部分的最大位数和总长度（包括小数点）。
 * 该类实现了InputFilter接口，用于在文本输入时进行过滤。
 */
public class InputNumLengthFilter implements InputFilter {

    public static final String TAG = "InputNumLengthFilter";

    private final int maxFractionDigits;
    private final int maxIntegerDigits;
    private static final String DECIMAL_POINT = ".";
    private static final Pattern VALID_INPUT_PATTERN =
            Pattern.compile("(\\d*\\.?\\d*)?");

    /**
     * 构造函数，初始化小数部分的最大位数和整数部分的最大位数。
     *
     * @param maxFractionDigits 小数部分的最大位数
     * @param maxIntegerDigits  整数部分的最大位数
     */
    public InputNumLengthFilter(int maxFractionDigits, int maxIntegerDigits) {
        this.maxFractionDigits = maxFractionDigits;
        this.maxIntegerDigits = maxIntegerDigits;
    }

    @Override
    public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
        String input = source.subSequence(start, end).toString();
        String currentText = dest.toString();

        // 拦截非法字符输入
        if (!isValidInput(input)) return "";

        // 处理小数点重复输入
        if (input.equals(DECIMAL_POINT) && currentText.contains(DECIMAL_POINT)) {
            return "";
        }

        // 拆分整数和小数部分
        String[] parts = currentText.split("\\.");
        String integerPart = parts.length > 0 ? parts[0] : "";
        String fractionPart = parts.length > 1 ? parts[1] : "";

        // 整数位数校验（新增前导零校验）
        if (isExceedingIntegerDigits(integerPart, input)) return "";

        // 小数位数校验
        if (isExceedingFractionDigits(fractionPart, input)) return "";

        // 总长度校验（包括小数点）
        if ((currentText.length() + input.length()) > calculateMaxLength()) {
            return "";
        }

        return null; // 允许输入
    }

    // 新增输入有效性校验
    private boolean isValidInput(String input) {
        return VALID_INPUT_PATTERN.matcher(input).matches();
    }

    // 新增整数位数校验（含前导零判断）
    private boolean isExceedingIntegerDigits(String integerPart, String newInput) {
        if (integerPart.isEmpty() && newInput.startsWith("0")) {
            return !newInput.equals(DECIMAL_POINT); // 允许"0."输入
        }
        return (integerPart.length() + newInput.length()) > maxIntegerDigits;
    }

    // 提取小数位数校验逻辑
    private boolean isExceedingFractionDigits(String fractionPart, String input) {
        return input.contains(DECIMAL_POINT) ||
                (fractionPart.length() + input.length()) > maxFractionDigits;
    }

    // 提取最大长度计算
    private int calculateMaxLength() {
        return maxIntegerDigits + maxFractionDigits + (maxFractionDigits > 0 ? 1 : 0);
    }
}